home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / util1 / shell-10.lha / shell-1.0 / src / util.c < prev    next >
C/C++ Source or Header  |  1995-12-07  |  2KB  |  129 lines

  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <ctype.h>
  6. #include <exec/memory.h>
  7. #include <dos/dostags.h>
  8. #include <proto/exec.h>
  9. #include <proto/dos.h>
  10.  
  11. int execute_command (int argc, char ** argv)
  12. {
  13.     char * ptr, * buffer;
  14.     int len, t, status;
  15.  
  16.     /* NOP ? */
  17.     if (!argc)
  18.     return 0;
  19.  
  20.     /* Count size of commandline */
  21.     for (len=t=0; t<argc; t++)
  22.     len += strlen(argv[t])+3;
  23.  
  24.     /* Allocate memory for it */
  25.     buffer = AllocMem (len+1, MEMF_ANY);
  26.  
  27.     if (!buffer)
  28.     {
  29.     fprintf (stderr, "FOR: Cannot allocate memory (%d) to call a command\n",
  30.         len);
  31.     return 20;
  32.     }
  33.  
  34.     /* fill it */
  35.     ptr = buffer;
  36.     for (t=0; t<argc; t++)
  37.     {
  38.     if (strchr (argv[t], ' ') || strchr (argv[t], '\t'))
  39.     {
  40.         *ptr ++ = '"';
  41.         strcpy(ptr, argv[t]);
  42.         ptr += strlen (ptr);
  43.         *ptr ++ = '"';
  44.     }
  45.     else
  46.     {
  47.         strcpy(ptr, argv[t]);
  48.         ptr += strlen (ptr);
  49.     }
  50.     *ptr ++ = ' ';
  51.     }
  52.  
  53.     ptr[-1] = '\n';
  54.     *ptr = 0;
  55.  
  56.     /* Call command */
  57.     status = SystemTags (buffer,
  58.     SYS_UserShell, TRUE,
  59.     TAG_END);
  60.  
  61.     if (SetSignal(0L,0L) & SIGBREAKF_CTRL_C)
  62.     {
  63.     Write (Output(), "***Break\n", 9);
  64.     status = 10;
  65.     }
  66.  
  67.     /* Warnings don't count */
  68.     if (status == 5)
  69.     status = 0;
  70.  
  71.     /* free memory */
  72.     FreeMem (buffer, len);
  73.  
  74.     return status;
  75. } /* execute_command */
  76.  
  77. #define BUFFERSIZE    256
  78.  
  79. char * replace_vars (char * str)
  80. {
  81.     char * newstr;
  82.     int len;
  83.     char * ptr, * iptr;
  84.     char varname[64], * vptr;
  85.     char * varbuffer;
  86.  
  87.     newstr = malloc (4096);
  88.     varbuffer = AllocMem (BUFFERSIZE, MEMF_ANY);
  89.     ptr=newstr;
  90.  
  91.     for (iptr=str; *iptr; )
  92.     {
  93.     if (*iptr=='$')
  94.     {
  95.         vptr = varname;
  96.         iptr ++;
  97.  
  98.         while (isalnum(*iptr))
  99.         *vptr ++ = *iptr ++;
  100.  
  101.         *vptr = 0;
  102.  
  103.         len = GetVar (varname, varbuffer, BUFFERSIZE-1, 0);
  104.         if (len != -1)
  105.         {
  106.         varbuffer[len] = 0;
  107.  
  108.         strcpy (ptr, varbuffer);
  109.         ptr += len;
  110.         }
  111.         else
  112.         {
  113.         *ptr ++ = '$';
  114.         strcpy (ptr, varname);
  115.         ptr += strlen (ptr);
  116.         }
  117.     }
  118.     else
  119.         *ptr ++ = *iptr ++;
  120.     }
  121.  
  122.     *ptr = 0;
  123.  
  124.     FreeMem (varbuffer, BUFFERSIZE);
  125.  
  126.     return newstr;
  127. } /* replace_vars */
  128.  
  129.